﻿using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace Home.MobileSales.ImpExpData.Core
{
    internal class FtpWork:IDisposable
    {
        public delegate void StatusDelegate(string s, bool b);

        public event StatusDelegate ShowStatus;
        public event StatusDelegate ShowLog;
        private IntPtr lFtpHandle;
        private IntPtr lInternetHandle;

        [DllImport("wininet.dll", CharSet = CharSet.Unicode)]
        private static extern IntPtr InternetConnect(IntPtr hInternet, string ServerName, ushort ServerPort, string sUserName, string sPassword, uint nService, uint nFlags, uint nContext);
        [DllImport("wininet.dll", CharSet = CharSet.Unicode)]
        public static extern IntPtr InternetOpen(string sAgent, uint nAccessType, string sProxy, string sProxyBypass, uint nFlags);
        [DllImport("wininet.dll")]
        public static extern bool FtpPutFile(IntPtr ulSession, string strLocalFile, string strRemoteFile, ulong ulFlags, ulong ulContext);
        [DllImport("wininet.dll")]
        public static extern bool FtpGetFile(IntPtr ulSession, string strRemoteFile, string strLocalFile, bool bolFailIfExist, ulong ulFlags, ulong ulInetFals, ulong ulContext);
        [DllImport("wininet.dll")]
        public static extern bool InternetCloseHandle(IntPtr hInet);

        public void CloseConnection()
        {
            InternetCloseHandle(this.lFtpHandle);
            InternetCloseHandle(this.lInternetHandle);
        }

        public bool GetFileFromFtp(string remotefile, string localfile, bool rewrite)
        {
            FileInfo file = new FileInfo(localfile);
            ShowStatus("Завантаження файлу " + file.Name + "...", false);
            if (!FtpGetFile(this.lFtpHandle, remotefile, localfile, rewrite, 2L, 0L, 0L))
            {
                ShowStatus("Помилка при завантаженні файлу " + file.Name, true);
                return false;
            }
            ShowLog("Файл " + file.Name + " завантажено з FTP", false);
            return true;
        }

        public bool PutFilesToFTP(string remotefile, string localfile)
        {
            FileInfo file = new FileInfo(localfile);
            ShowStatus("Відправка файлу " + file.Name + "...", false);
            if (!FtpPutFile(this.lFtpHandle, localfile, remotefile, 2L, 0L))
            {
                ShowLog("Помилка при відправці файлу " + file.Name, true);
                return false;
            }
            ShowLog("Файл " + file.Name + " відправлено", false);
            return true;
        }



        public bool OpenConnection(string strFTPServerName, ushort intFTPPort, string strUsername, string strPassword, bool isPasiveMode)
        {
            
            uint nFlags = isPasiveMode ? (uint)0x08000000 : (uint)0x00000000;
            
            uint nService = 1;
            this.lInternetHandle = InternetOpen("FTPOpen", 1, "", "", 0);
            ShowStatus("Зєднання з фтп...", false);
            if (this.lInternetHandle.ToInt32() == 0)
            {
                ShowLog("Неможливо розпочати сесію", true);
                return false;
            }
            this.lFtpHandle = InternetConnect(this.lInternetHandle, strFTPServerName, intFTPPort, strUsername, strPassword, nService, nFlags, 0);
            if (this.lFtpHandle.ToInt32() == 0)
            {
                ShowLog("Неможливо підєднатись до ФТП серверу", true);
                return false;
            }
            ShowStatus("З'єднанння встановлено", false);
            ShowLog("З'єднанння встановлено", false);
            return true;
        }

        #region IDisposable Members

        public void Dispose()
        {
            CloseConnection();
        }

        #endregion
    }


}

